package com.gitee.deament.server.core.cli.db.list;

import cn.hutool.core.util.NumberUtil;
import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.List;

/**
 * LINSERT key BEFORE|AFTER pivot value
 * 可用版本： >= 2.2.0
 * 时间复杂度: O(N)， N 为寻找 pivot 过程中经过的元素数量。
 * 将值 value 插入到列表 key 当中，位于值 pivot 之前或之后。
 *
 * 当 pivot 不存在于列表 key 时，不执行任何操作。
 *
 * 当 key 不存在时， key 被视为空列表，不执行任何操作。
 *
 * 如果 key 不是列表类型，返回一个错误。
 *
 * 返回值
 * 如果命令执行成功，返回插入操作完成之后，列表的长度。 如果没有找到 pivot ，返回 -1 。 如果 key 不存在或为空列表，返回 0 。
 *
 * @author deament
 */
@CliHander(command = "LINSERT")
public class LINSERTcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() != 5) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'LINSERT' command"));
            return;
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        DBData dbData = SystemConfig.dbData;
        String key = cliValues.get(1);
        String option = cliValues.get(2);
        String pivot=cliValues.get(3);
        String valueStr=cliValues.get(4);
        if(!option.equalsIgnoreCase("BEFORE")&&!option.equalsIgnoreCase("AFTER") ){
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("第三个参数不合法"));
        }
        try {
            List<String> value = SystemConfig.dbData.getList(db, key).getValue();
            if (value == null) {
                channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("0"));
                return;
            }
           int   pivotIndex=value.indexOf(pivot);
            if(pivotIndex==-1){
                channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("-1"));
                return;
            }
            int insertIndex=pivotIndex;
            if(option.equalsIgnoreCase("AFTER")){
                insertIndex=pivotIndex+1;
            }
            value.add(insertIndex, valueStr);


            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(""+value.size()));
        }catch (Exception e){
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(e.getMessage()));
            return;
        }
    }
}
